Ddoc

$(DERS_BOLUMU $(IX 惰性求值) 惰性运算符)

$(P
惰性求值即推迟表达式的执行，直到需要表达式的值。惰性求值是许多语言的基础特性。
)

$(P
如果结果最终并不需要，延迟求值自然可以让程序运行得更快。
)

$(P
$(IX 短路求值) 下面的运算符短路行为与惰性求值是相似的概念：
)

$(UL

$(LI $(IX ||, 短路) $(IX 逻辑或运算符) $(C ||) ($(I 或))运算符：第二个表达式只有在第一个表达式为 $(C false) 时才会执行。

---
    if (anExpression() || mayNotBeEvaluated()) {
        // ...
    }
---

$(P
如果 $(C anExpression()) 的结果是 $(C true)， 那么 $(C ||) 表达式的结果就一定是 $(C true)。因为我们不需要对第二个表达式求值来确定 $(C ||) 表达式的结果，所以第二个表达式不会被求值。
)

)

$(LI $(IX &&, 短路) $(IX 逻辑与运算符) $(C &&) ($(I 与))运算符：第二个表达式只有在第一个表达式为 $(C true) 时才会执行。

---
    if (anExpression() && mayNotBeEvaluated()) {
        // ...
    }
---

$(P
如果 $(C anExpression()) 的结果是 $(C false)，那么 $(C &&) 表达式的结果必然是 $(C false)，因此第二个表达式不会被求值。
)

)

$(LI $(IX ?:, 短路) $(IX 三元运算符) $(IX 条件运算符) $(C ?:) ($(I 三元))运算符：第一个或第二个表达式是否被执行分别依赖于条件是 $(C true) 还是 $(C false)。

---
    int i = condition() ? eitherThis() : orThis();
---

)

)

$(P
这些运算符的惰性不仅仅是与性能相关。有时，执行表达式会发生错误。
)

$(P
例如，如果字符串是空的，下面的条件$(I 第一个字符是 A) 会出错：
)

---
    dstring s;
    // ...
    if (s[0] == 'A') {
        // ...
    }
---

$(P
为了正确的访问 $(C s) 的第一个元素，我们首先要确认字符串里的确有那个元素。因此，下面的条件把有潜在错误的逻辑表达式放在了 $(C &&) 运算符的右边，确保其只有在安全的情况下才执行：
)

---
    if ((s.length >= 1) && (s[0] == 'A')) {
        // ...
    }
---

$(P
惰性求值可以通过 $(LINK2 /ders/d.cn/lambda.html, 函数指针, delegate) 完成，也可以用 $(LINK2 /ders/d.cn/ranges.html, range)。我们会在后面的章节见到这些。
)

Macros:
        SUBTITLE=惰性运算符

        DESCRIPTION=D 编程语言中的惰性（短路）运算符。

        KEYWORDS=d 编程 语言 教程 惰性 lazy
